// ====================================================================
// GLCanvas class by Rob Jagnow.
// ====================================================================

#ifndef _GL_CANVAS_H_
#define _GL_CANVAS_H_

#include <cassert>
#include "mesh.h"

class ArgParser;
class IFS;
class Mesh;
class Camera;

// ====================================================================
// NOTE:  All the methods and variables of this class are static
// ====================================================================

class GLCanvas {

public:

  // Set up the canvas and enter the rendering loop
  // Note that this function will not return but can be
  // terminated by calling 'exit(0)'
  static void initialize(ArgParser *_args, Mesh *_mesh);

  static void checkBoundingBoxes(float x,float y);
  static void cutCloth(ClothParticle& cp, int i, int j, bool topEdge, bool bottomEdge, bool leftEdge, bool rightEdge);
  void SmoothMotion(int x, int y);
  
  static int curmouseX;
  static int curmouseY;
  
private:

  static void InitLight();

  // various static variables
  static ArgParser *args;
  static Mesh *mesh;
  static Camera* camera;
  static int display_list_index;
  // state of the mouse cursor
  static int mouseButton;
  static int mouseX;
  static int mouseY;
  static bool controlPressed;
 

  // Callback functions for mouse and keyboard events
  static void display(void);
  static void reshape(int w, int h);
  static void mouse(int button, int state, int x, int y);
  static void motion(int x, int y);
  static void keyboard(unsigned char key, int x, int y);

  static void Render();
};

// ====================================================================

int HandleGLError();

#endif

